/**
 *
 */
package com.hexacta.hrs.domain.helper;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;

import org.vectrics.employee.Employee;

import com.hexacta.hrs.domain.employee.history.CareerRole;

/**
 * @author ldeveikis
 * 
 */
public abstract class EmployeeHelper {
    /**
     * 
     * @param employee
     * @param fromDate
     * @param toDate
     * @return
     */
    public static List<CareerRole> findRolesBetweenDates(final Employee employee, final Date fromDate, final Date toDate) {
        TreeMap<Date, CareerRole> roleMap = new TreeMap<Date, CareerRole>();
        for (CareerRole role : employee.getEmploymentConditionHistory().getCareerRoles()) {
            roleMap.put(role.getEffectiveDate(), role);
        }
        // Para evitar exceptions por que la implementacion que devuelve el
        // metodo values no permite que se agregue otro valor.
        List<CareerRole> toReturn = new ArrayList<CareerRole>();
        toReturn.addAll(roleMap.subMap(fromDate, true, toDate, true).values());
        // Ahora debo agregar el role inmeditamente anterior a la fecha date, ya
        // que ese no se devuelve con el metodo subMap. Voy a iterar sobre el
        // map. Las keys se devuelven en orden ascendente ya que el TreeMap se
        // encuentra ordenado
        Iterator<Date> iterator = roleMap.keySet().iterator();
        Date date, nextDate = new Date();
        if (iterator.hasNext()) {
            date = iterator.next();
            while (iterator.hasNext()) {
                nextDate = iterator.next();
                // Solo tengo las fechas de inicio de las asignaciones, pero no
                // las de fin, por eso comparo la proxima que la tomo como la de
                // inicio de la asignacion actual.
                if (nextDate.compareTo(fromDate) <= 0) {
                    date = nextDate;
                }
            }

            if (date.before(fromDate)) {
                toReturn.add(roleMap.get(date));
            }
        }
        return toReturn;
    }
}
